R は統計、データ分析、作図のためのインタープリタープログラミング言語
統計やデータ分析を行うアプリ
Excel は表計算ソフトで多くの機能を有している
Excelでできること



CUI: Character User Interface
GUI: Graphic User Interface
posit.Cloudの無料プランを使う
PCにインストール
j:というドライブの下のabezemiというフォルダの下にあるr_renshuというフォルダにあるkadai1.Rというファイルがあるとする。
そのファイルのpathはj:/abezemi/r_renshu/kadai1.Rとなる。
コンピュータ上では、このように文字でファイルの場所と名前を指定することがよくある。
コンピューター上では、どこかのディレクトリ(フォルダ)がRの作業場所になっている。
今の作業場所はgetwd()で表示できる。
getwd()
これを変更するにはsetwd(path)で変更できる。
setwd("j:/abezemi")
ここではj:ドライブの下のabezemiフォルダに設定。
もう一度getwd()して変更されたか確認しよう。
作業場所を指定しても、ファイルの管理が面倒だったりする。
RStudioのRプロジェクトという機能を使うと、以下のメリットがある
File -> "New Project" -もしくは右上の "Project (none)"
New Directoryでプロジェクトを作成
"New Project"を選択
プロジェクト名を入力: r_renshu
Rとの"対話"は、Rstudioの左下のペイン(Console)で行われる。 そのままConsoleに入力しても機能するが、スクリプト(コード)に書くことで、記録を残しながらRに命令を与えることができる。
作成
Rスクリプトは.Rで終わるファイルとして保存される (例:kadai1.R)
保存
R scriptに以下のように書く
print("Hello World!")
## [1] "Hello World!"
カーソルが同じ行にあることを確認して、をクリック
もしくは、[Ctrl]を押しながらEnter
"Hello World!"と表示されれば成功。
R script上では#から始まる行は、コメントとして認識され、実行するとコンソールには表示されるが、何も起こらない。
メモなどを書く際に使う。
# これは初めてのRのコードです。
print("Hello World")
## [1] "Hello World"
もしくは一度使ったが、今は実行したくないコードを一時的に無効にする(コメントアウト)
# print("Good Evening")
コメントや改行を活用して読みやすいコード(スクリプト)を書く。 Rのコードでは空行は意味をなさないのでいくらでも空けてよい。
# Rの練習1
# 2024年4月15日
# ------ ライブラリ ---------
library(tidyverse)
# ------ コード本体 ---------
# はじめまして
print("Hello World!")
# 足し算
x <- 1 + 1
# データを読み込む
# このデータはXXでダウンロードした
data <- read_csv("data/data1.csv")
よくない例
library(tidyverse)
print("Hello World!")
x <- 1 + 1
data <- read_csv("data/data1.csv")
# これは間違ったコード(tを忘れてる)
prin("Hello World")
## Error in prin("Hello World"): could not find function "prin"
Error in read_csv("data/Countries.csv") :
could not find function "read_csv"
XXXという関数が見つかりません、というエラー
考えられるケース
library()で必要なパッケージを読み込めてないError: 'data/Countris.csv' does not exist in current working directory
XXX.csvというファイルが作業場所にありません。
考えられるケース
オブジェクト内の要素や、ファイル名などを補完してくれる機能
Rstudioを自分好みにカスタマイズすることが可能
[Tools]->[Global Options...]
例えば外観の変更
# 足し算
1 + 1
## [1] 2
#掛け算は *
2 * 3
## [1] 6
# 割り算は /
(2+7)/3
## [1] 3
# 割り切れない場合はある程度まで桁が表示
10/3
## [1] 3.333333
# 1
9179/67
## [1] 137
# 2
(256*43+54)/8
## [1] 1382.75
# 3
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12
## [1] 78
書いてあることが真か偽か?
# 「10は5より大きい」という命題は正しい?
10 > 5
## [1] TRUE
# 「等しい」は=が2つ ==
"musashi" == "musashi"
## [1] TRUE
"musashi" == "634"
## [1] FALSE
# x や yという「入れ物」に数字を代入
x <- 8
y <- 3
z <- x + y
z
## [1] 11
for(i in 1:10){
print(i+1)
}
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
## [1] 11
1から50までを合計する繰り返し文を書いてみよう。
\(1+2+3+\cdots+50=\)
ヒント:まずgoukeiというオブジェクトを用意して0を入れてみよう。
# まずgoukeiに0を入れる
goukei = 0
for(i in 1:50){
goukei = goukei + i
}
print(goukei)
## [1] 1275
もしある命題が真ならどうする、偽ならどうするというifの条件によって異なる処理を行うif文もプログラミングの基本だ。Rでも簡単に実装できる。
x <- 5
# もしxが0より大きいなら、yに3+xを代入するという処理を実行する。
if(x > 0){
y = 3 + x
}
print(y)
## [1] 8
命題が偽の場合
x <- -4
# もしxが0より大きいなら、wに3+xを代入するという処理を実行する。
if(x > 0){
w = 3 + x
}
# 上の処理は実行されていないのでwは定義されず、"not found"というエラーが出る。
print(w)
## Error in print(w): object 'w' not found
もし命題が偽だった場合の処理も指定できる。
x <- -5
# もしxが0より大きければ3を足してvに代入、
# そうでなければ3を引いてvに代入。
if(x > 0){
v = x + 3
}else{
v = x - 3
}
print(v)
## [1] -8
Rのオブジェクトにはいくつかの「型」がある
# 実数
x <- 634
mode(x)
## [1] "numeric"
# 文字列
y <- "musashi"
mode(y)
## [1] "character"
数字であっても文字列として扱われていると、計算ができない
# 数字だが文字列
z <- "634"
mode(z)
## [1] "character"
z + 6
## Error in z + 6: non-numeric argument to binary operator
# データ型のチェック
mode(z)
## [1] "character"
# 実数かどうか?
is.numeric(z)
## [1] FALSE
# データ型を実数に変換して再度zに代入
z <- as.numeric(z)
# 再度チェック
is.numeric(z)
## [1] TRUE
順序のある要素の集まりをベクトルと呼ぶ。
c()関数で作成することができる。
v1 <- c(1,2,3,4,5)
print(v1)
## [1] 1 2 3 4 5
ベクトルは、文字や論理値など取ることができる。
v2 <- c("musashi","nerima","ekoda")
print(v2)
## [1] "musashi" "nerima" "ekoda"
v3 <- c(FALSE,TRUE,TRUE,FALSE)
print(v3)
## [1] FALSE TRUE TRUE FALSE
異なるデータ型を同じベクトルに混ぜることはできない。 混ぜると、一定のルールに基づいてある型が他の型より優先される
# 数値と論理値を混ぜると、数値になる。(FALSE->0, TRUE->1)
v4 <- c(FALSE,1,TRUE)
print(v4)
## [1] 0 1 1
# 数値と論理値と文字列を混ぜると、全部文字列になる
v5 <- c(FALSE,1,"musashi")
print(v5)
## [1] "FALSE" "1" "musashi"
連続した数値を入力したい場合はコロン:を使う
v6 <- c(1:10)
print(v6)
## [1] 1 2 3 4 5 6 7 8 9 10
nずつ増える数列を作りたい場合は、seq()関数を使う
# 例:2から50まで2ずつ増える数列
v7 <- seq(2,50,by=2)
練習問題:3から60まで3ずつ増える数列ベクトルを作りなさい
# 3から60まで3ずつ増える数列
v7_ex <- seq(3,60,by=3)
print(v7_ex)
## [1] 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60
同じ数値がたくさんあるベクトルを作りたい場合はrep()関数を使う
# 5が100個ならぶベクトル
v8 <- rep(5,100)
print(v8)
## [1] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
## [37] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
## [73] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
本当に100個出てるか?
ベクトルの要素の数を数える関数はlength
length(v8)
## [1] 100
ベクトルのn個目の要素を参照したいときは角カッコを使う[]
# v7の3つ目の要素は6
v7[3]
## [1] 6
# v7の2,3,5つ目の要素
v7[c(2,3,5)]
## [1] 4 6 10
様々なベクトルやデータなどのオブジェクトをひとまとめにして扱うことができるのがリスト
リストはlist()関数で作成する
# aというオブジェクトに、文字列ベクトル、数値ベクトル、データが混ざって入っている。
# カンマ, の後に改行しているが、listのかっこが閉じるまではひとまとまりだと扱われる。
a <- list(
c("a", "b", NA, "d"),
num = c(3, 1.1, 5),
data = head(mtcars, 1))
a
## [[1]]
## [1] "a" "b" NA "d"
##
## $num
## [1] 3.0 1.1 5.0
##
## $data
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21 6 160 110 3.9 2.62 16.46 0 1 4 4
リストの参照も角カッコでできる
# リストの参照
a[1]
## [[1]]
## [1] "a" "b" NA "d"
a[2]
## $num
## [1] 3.0 1.1 5.0
リストの中身のみを取り出したい場合は、二重括角カッコを使う[[]]
a[[3]]
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21 6 160 110 3.9 2.62 16.46 0 1 4 4